library(tableone)
Warning: package ‘tableone’ was built under R version 4.2.3
# Note that there's a package that does this smoothly. Need to add it as an alternative at some point
#columnNames<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE)[1,]
#qual_data<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE,col.names = columnNames)[-c(1:3),]
# write a new version that can be reimported with the proper column classes
#write.csv(qual_data,"../04-ProcessedData/MHHS-1_12202023_cleanheader.csv",row.names=FALSE)
save(mhhs_demotbl,"../04-ProcessedData/Demotable.RDS")
Error in save(mhhs_demotbl, "../04-ProcessedData/Demotable.RDS") :
object ‘../04-ProcessedData/Demotable.RDS’ not found
PROMIS_Global v1.2
To score the PROMIS_Global: First check if survey coded Excellent as
1 or as 5. Qualtrics will often reverse them. Higher scores should
reflect better functioning.
PROMIS_Global1_1:PROMIS_Global1_7: Items rated from 5 (excellent) to
1 (Not at all) on original scale; PROMIS_Global1_1:PROMIS_Global1_7 are
reversed from Qualtrics 1-5 defaults
PROMIS_Global2_1: emotional problems; past 7 days; 5 (never) to 1
(always); (global 10) PROMIS_Global2_2: fatigue; past 7 days (global
08)
PROMIS_Global3_1: pain. 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10
For scoring, “2 questions were excluded from the
calculation/evaluation as a result of the questionnaire development
study: Global01 because of its statistical congruence with Global03.
Global09r because of its approximately equal statistical correlation to
physical and mental health.”
The Global Physical Health score is generated by summing responses to
Global03 (PROMIS_Global1_3), Global06 (PROMIS_Global1_7),
Global07rescored (PROMIS_Global3_1), and Global08rescored
(PROMIS_Global2_2). The Global Mental Health score is generated by
summing responses to Global02 (PROMIS_Global1_2), Global04
(PROMIS_Global1_4), Global05(PROMIS_Global1_5), and Global10rescored
(PROMIS_Global2_1)
promis_global<-mhhs_data %>% select(contains("PROMIS"))
#score items so that higher scores reflect better functioning
# pain item: 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10
# renaming the Promis to match the original measure
promis_global<-promis_global %>% rename_with(~sprintf("PROMIS_Global0%d",1:5),.cols=c(PROMIS_Global1_1:PROMIS_Global1_5)) %>% rename(PROMIS_Global09=PROMIS_Global1_6,PROMIS_Global06=PROMIS_Global1_7, PROMIS_Global10=PROMIS_Global2_1, PROMIS_Global08=PROMIS_Global2_2,PROMIS_Global07=PROMIS_Global3_1)%>% mutate(across(c(PROMIS_Global01:PROMIS_Global08),~6-.)) %>%
mutate(PROMIS_Global07=recode(PROMIS_Global07,`0`=5,`1`=4,`2`=4,`3`=4,`4`=3,`5`=3,`6`=3,`7`=2,`8`=2,`9`=2,`10`=1))%>%
rowwise() %>% mutate(PG_PhysHealth=sum(c(PROMIS_Global03,PROMIS_Global06,PROMIS_Global07,PROMIS_Global08)),PG_MentHealth=sum(c(PROMIS_Global02,PROMIS_Global04,PROMIS_Global05,PROMIS_Global10))) %>% ungroup()
promis_global_scoring<-promis_global %>% select(-PROMIS_Global01, -PROMIS_Global09,-PG_PhysHealth,-PG_MentHealth)
key_promis.list<-list(PH=c("PROMIS_Global03","PROMIS_Global06","PROMIS_Global07","PROMIS_Global08"),MH=c("PROMIS_Global02","PROMIS_Global04","PROMIS_Global05","PROMIS_Global10"))
key_promis<-make.keys(nvars=8,key_promis.list,item.labels = colnames(promis_global_scoring))
scales_promis<-scoreItems(key_promis,promis_global_scoring)
summary(scales_promis)
GHSQL
GHSQL has one open-response item. This is not included in the summary
score. Scoring also seems somewhat flexible and includes
informal/formal; personal-emotional/suicide; help from anyone/Help from
no-one.
Range 1-7 (Extremely unlikely to Extremely Likely)
ghsql<-mhhs_data %>% select(contains("GHSQL"))
ghsql<-ghsql %>% mutate(General=rowSums((select(ghsql,GHSQL_Pers_1:GHSQL_Pers_9,GHSQL_SUI_1:GHSQL_SUI_9)))) %>%
rowwise() %>%
mutate(Personal=sum(c_across(GHSQL_Pers_1:GHSQL_Pers_8)),
Suicide=sum(c_across(GHSQL_SUI_1:GHSQL_SUI_8)),
Informal_all=sum(c(GHSQL_Pers_1,GHSQL_SUI_1,GHSQL_Pers_2,GHSQL_SUI_2,GHSQL_Pers_3,GHSQL_SUI_3,GHSQL_Pers_4,GHSQL_SUI_4)),
Formal_all=sum(c(GHSQL_Pers_5,GHSQL_SUI_5,GHSQL_Pers_6,GHSQL_SUI_6,GHSQL_Pers_7,GHSQL_SUI_7,GHSQL_Pers_8,GHSQL_SUI_8)),
None_all=sum(c(GHSQL_Pers_9,GHSQL_SUI_9))) %>%
ungroup() %>% #remove rowwise grouping
mutate(Personal_z=scale(Personal),Suicide_z=scale(Suicide),Informal_all_z=scale(Informal_all),Formal_all_z=scale(Formal_all),None_all_z=scale(None_all))
#make a dataframe with only the items to be scored/that need reliability
ghsql_scoring<-ghsql %>% dplyr::select(1:9,12:20)
key_ghsql.list<-list(General=c(1:18),Personal=c(1:9),Suicide=c(10:18),Formal=c(5,14,6,15,7,16,8,17),Informal=c(1,10,2,11,3,12,4,13))
key_ghsql<-make.keys(18,key_ghsql.list,colnames(ghsql_scoring))
scales_ghsql<-scoreItems(key_ghsql.list,ghsql_scoring)
summary(scales_ghsql)
Call: scoreItems(keys = key_ghsql.list, items = ghsql_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
General Personal Suicide Formal Informal
General 0.78 1.36 1.24 1.07 1.05
Personal 0.87 0.52 1.03 1.16 1.06
Suicide 0.93 0.63 0.72 1.03 1.05
Formal 0.86 0.76 0.80 0.83 0.59
Informal 0.82 0.68 0.79 0.48 0.78
#histogram to explore the range
ghsql %>% select(GHSQL_Pers_1:GHSQL_Pers_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 300 rows containing non-finite values (`stat_boxplot()`).


ghsql %>% select(GHSQL_SUI_1:GHSQL_SUI_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 343 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(Informal_all_z,Formal_all_z,None_all_z) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Informal (Pers + Sui)","Formal (Pers + Sui)","None (Pers + Sui)"))+ theme(axis.text.x = element_text(angle=90))
Warning: attributes are not identical across measure variables; they will be dropped
Warning: Removed 178 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(GHSQL_Pers_10_TEXT,GHSQL_SUI_10_TEXT) %>% filter(GHSQL_Pers_10_TEXT!=""|GHSQL_SUI_10_TEXT!="")
NA
DASS21
Stress items are 1, 6, 8, 11, 12, 14, 18 Anxiety items are 2, 4, 7,
9, 15, 19, 20,
Depression items are 3, 5, 10, 13, 16, 17, 21
The depression scale assesses dysphoria, hopelessness, devaluation of
life, self-deprecation, lack of interest / involvement, anhedonia and
inertia.
The anxiety scale assesses autonomic arousal, skeletal muscle
effects, situational anxiety, and subjective experience of anxious
affect. The stress scale is sensitive to levels of chronic nonspecific
arousal. It assesses difficulty relaxing, nervous arousal, and being
easily upset / agitated, irritable / over-reactive and impatient.
Scores for depression, anxiety and stress are calculated by summing
the scores for the relevant items
Scores on the DASS-21 will need to be multiplied by 2 to calculate
the final score and stay equivalent with DASS-42.
dass<-mhhs_data %>% select(contains("DASS"))
dass<-dass %>% mutate(Dass21_Total=rowSums((select(dass,DASS21_1:DASS21_21)))*2) %>%
rowwise() %>%
mutate(Dass21_Stress=sum(DASS21_1,DASS21_6, DASS21_8,DASS21_11,DASS21_12,DASS21_14,DASS21_18,na.rm = T),
Dass21_Anxiety=sum(DASS21_2,DASS21_4,DASS21_7,DASS21_9,DASS21_15,DASS21_19,DASS21_20, na.rm=T),
Dass21_Depression=sum(DASS21_3,DASS21_5,DASS21_10,DASS21_13,DASS21_16,DASS21_17,DASS21_21, na.rm=T)) %>%
ungroup() %>%
mutate(Dass21_Stress_z=scale(.,)) %>%
mutate(Dep_cuts=case_when(Dass21_Depression<10~"Normal",
Dass21_Depression<14~"Mild",
Dass21_Depression<21~"Moderate",
Dass21_Depression<28~"Severe",
Dass21_Depression>27~"Extremely_Severe"),
Anx_cuts=case_when(Dass21_Anxiety<8~"Normal",
Dass21_Anxiety<10~"Mild",
Dass21_Anxiety<15~"Moderate",
Dass21_Anxiety<20~"Severe",
Dass21_Anxiety>19~"Extremely_Severe"),
Stress_cuts=case_when(Dass21_Stress<15~"Normal",
Dass21_Stress<19~"Mild",
Dass21_Stress<26~"Moderate",
Dass21_Stress<34~"Severe",
Dass21_Stress>33~"Extremely_Severe"))
#make a dataframe with only the items to be scored/that need reliability
dass_scoring<-dass %>% dplyr::select(DASS21_1:DASS21_21)
key_dass.list<-list(Stress=c(1,6,8,11,12,14,18),Anxiety=c(2,4,7,9,15,19,20),Depression=c(3,5,10,13,16,17,21))
key_dass<-make.keys(21,key_dass.list,colnames(dass_scoring))
scales_dass<-scoreItems(key_dass.list,dass_scoring)
summary(scales_dass)
#histogram to explore the range
dass %>% select(Dass21_Stress,Dass21_Anxiety, Dass21_Depression) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Stress","Anxiety","Depression"))+ theme(axis.text.x = element_text(angle=90))
#scatterplot to color the cutoffs
dass_severity<-dass %>% select(Dass21_Stress,Dass21_Anxiety, Dass21_Depression) %>%
pivot_longer(cols=starts_with("Dass21"),names_to = "Subscale",values_to = "score") %>% mutate(Cuts=case_when((Subscale=="Dass21_Depression" & score<10) ~"Normal",
(Subscale== "Dass21_Depression"& score<14)~"Mild",
(Subscale== "Dass21_Depression"& score<21)~"Moderate",
(Subscale== "Dass21_Depression"& score<28)~"Severe",
(Subscale== "Dass21_Depression"& score>27)~"Extremely_Severe",
(Subscale=="Dass21_Anxiety"& score<8)~"Normal",
(Subscale== "Dass21_Anxiety"& score<10)~"Mild",
(Subscale== "Dass21_Anxiety"& score<15)~"Moderate",
(Subscale== "Dass21_Anxiety"& score<20)~"Severe",
(Subscale== "Dass21_Anxiety"& score>19)~"Extremely_Severe",
(Subscale=="Dass21_Stress"& score<15)~"Normal",
(Subscale=="Dass21_Stress"& score<19)~"Mild",
(Subscale=="Dass21_Stress"& score<26)~"Moderate",
(Subscale== "Dass21_Stress"& score<34)~"Severe",
(Subscale== "Dass21_Stress"& score>33)~"Extremely_Severe"))
#severity histogram colored by severity
dass_scatter %>% ggplot(aes(score,fill=Subscale,group=Subscale))+geom_bar()
#jitter plot colored by severity
dass_scatter %>% ggplot(aes(x=Subscale,y=score,colour=Cuts))+geom_jitter()+theme_classic()+scale_color_brewer(palette = "Set1")
ISMI29
29-item measure assessing self stigma of mental illness. Includes
subscales: alienation, stereotype endorsement, discrimination
experience, social withdrawal, stigma resistance. Scored from 1-4. The
entire Stigma resistance subscale is reverse scored.
Traditional scoring is dichotomous and uses means.
ismi<-mhhs_data %>% select(contains("ISMI"))
ismi<-ismi %>% rowwise() %>%
mutate(ISMI_Alientation=sum(ISMI29_1,ISMI29_5,ISMI29_8,ISMI29_16,ISMI29_17,ISMI29_21),
ISMI_Stere=sum(ISMI29_2, ISMI29_6,ISMI29_10,ISMI29_18,ISMI29_19,ISMI29_23,ISMI29_29),
ISMI_Discr=sum(ISMI29_3,ISMI29_15,ISMI29_22,ISMI29_25,ISMI29_28),
ISMI_Withdrawal=sum(ISMI29_4,ISMI29_9,ISMI29_11,ISMI29_12,ISMI29_13,ISMI29_20)) %>%
mutate(ISMI29_7=recode(ISMI29_7,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_14=recode(ISMI29_14,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_24=recode(ISMI29_24,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_26=recode(ISMI29_26,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_27=recode(ISMI29_27,`1`=4,`2`=3,`3`=2,`4`=1)) %>%
mutate(ISMI_Stigmar=sum(ISMI29_7,ISMI29_14,ISMI29_24,ISMI29_26,ISMI29_27)) %>%
ungroup()
#make a dataframe with only the items to be scored/that need reliability
ismi_scoring<-ismi %>% dplyr::select(ISMI29_1:ISMI29_29)
key_ismi.list<-list(Alien=c(1,5,8,16,17,21),Stereotype=c(2,6,10,18,19,23,29),Discrimination=c(3,15,22,25,28),Withdrawal=c(4,9,11,12,13,20),StigmaR=c(7,14,24,26,27))
key_ismi<-make.keys(29,key_ismi.list,colnames(ismi_scoring))
scales_ismi<-scoreItems(key_ismi.list,ismi_scoring)
summary(scales_ismi)
Call: scoreItems(keys = key_ismi.list, items = ismi_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Alien Stereotype Discrimination Withdrawal StigmaR
Alien 0.81 1.05 1.06 1.07 1.04
Stereotype 0.85 0.80 1.16 1.04 1.30
Discrimination 0.68 0.74 0.51 1.05 1.70
Withdrawal 0.87 0.84 0.67 0.81 1.18
StigmaR 0.32 0.39 0.41 0.36 0.12
ismi$ISMI29_14
[1] NA NA 2 2 2 4 2 3 1 2 2 2 2 4 2 2 1 1 1 3 2 3 4 2 4 3 4 2 2 2 2 2 2 2 2
[36] 1 4 2 3 4 2 3 2 4 3 4 3 2 3 1 3 2 2 3 4 2 4 2 2 2 2 2 2 2 3 1 2 2 4 2
[71] 4 3 2 1 4 3 3 3 2 4 4 1 NA 2 2 2 3 3 3 4 2 2 3 1 2 2 4 2 4 3 2 1 2 4 4
[106] 2 2 3 2 4 2 1 3 2 4 3 2 4 1 2 3 3 3 2 1 2 2 1 2 3 2 1 3 3 4 2 1 3 2 2
[141] 2 2 NA 4 NA 2 3 2 NA NA 3 1 2 2 2 2 3 1 2 2 2 2 2 3 2 2 4 1 2 3 4 NA 2 2 2
[176] 2 3 2 4 4 2 2 3 NA 2 2 3 3 2 2 1 1 4 2 2 1 3 1 4 3 2 2 2 4 3 2 4 NA 4 NA
[211] 4 3 2 4 2 4 3 3 2 2 1 2 3 1 3 1 1 2 2 3 4 3 1 2 3 1 2 1 4 2 1 4 4 2 4
[246] 4 1 2 2 3 2 4 4 3 2 2 3 4 3 4 2 2 2 4 2 4 4 2 2 1 2 4 3 3 3 4 NA 1 1 1
[281] 3 4 4 1 1 2 4 4 2 2 2 NA 2 2 2 1 2 2 4 1 2 1 3 3 3 2 2 4 2 1 2 3 3 2 1
[316] 3 4 4 3 4 2 4 1 2 2 NA NA 4 1 2 3 NA 1 3 2 3 1 1 3 2 3 3 2 2 2 2 2 1 2 4
[351] 1 2 4 4 3 3 1 1 3 2 1 2 2 1 3 1 1 3 2 3 2 NA NA 2 1 2 2 4 1 4 1 3 2 2 4
[386] 4 2 4 1 1 4 2 1 2 2 1 2 2 4 4 2 2 1 1 3 2 3 4 2 NA 1 NA 2 2 2 4 2 1 2 4
[421] 1 3 2 1 2 3 4 2 2 2 1 NA 2 NA 3 2 2 2 2 NA 1 3 1 2 2 2 2 1 4 2 3 NA 4 1 NA
[456] 1 4 2 4 2 2 2 2 2 4 4 2 2 3 2 3 2 2 3 1 2 1 2 2 3 4 2 NA 1 2 NA 4 4 3 4
[491] 2 NA 4 3 2 2 2 3 1 2 2 2 4 1 2 2 3 4 2 NA NA 1 3 2 2 NA 3 2 4 4 NA 1 1 4 4
[526] 4 4 NA 3 1 1 3 2 NA 2 4 3 3 1 NA 2 2 2 2 4 2 2 1 2 2 NA 2 2 NA NA 1 2 2 2 2
[561] 2 2 2 4 NA 2 2 3 2 NA 3 2 1 4 NA 3 3 1 3 2 2 2 2 2 2 4 2 2 2 2 4 3 2 2 2
[596] 1 2 2 2 3 2 1 2 2 1 3 1 3 2 4 2 1 2 3 2 1 NA 4 4 3 4 4 3 2 3 2 2 2 1 2
[631] 3 4 2 2 2 4 4 3 2 3 4 1 4 2 3 1 2 3 3 2 3 3 2 2 1 1 1 1 3 1 4 2 3 2 1
[666] 1 1 2 4 4 3 2 NA 4 2 1 2 3 2 1 3 4 1 3 4 NA 2 4 2 1 2 3 4 1 4 2 2 4 2 1
[701] 1 2 4 3 NA 1 2 3 1 2 3 2 2 NA 3 2 2 2 2 2 4 3 3 2 2 2 2 4 1 1 2 1 4 2 1
[736] 1 NA 1 3 2 1 3 3 2 2 2 3 2 1 3 2 3 4 2 1 2 1 1 2 2 2 2 2 3 2 2 4 2 4 2
[771] 2 NA NA 2 3 2 2 NA 1 3 4 4 3 4 2 NA 2 2 3 1 1 2 NA 2 1 2 1 NA 1 2 2 2 2 4 4
[806] 2 2 2 2 3 2 3 2 1 2 2 2 2 3 3 3 3 3 1 2 2 1 4 3 2 NA 3 3 4 1 4 2 1 4 2
[841] 1 3 NA 2 1 2 4 2 2 4 3 2 3 2 3 3 4 2 4 2 1 1 1 3 3 3 3 2 2 2 1 1 1 2 NA
[876] 2 1 3 3 NA 1 2 3 NA NA NA 2
cor(ismi$ISMI_Stigmar,ismi$ISMI_Alientation,use="complete.obs")
[1] -0.1243007
ismi %>% select(ISMI_Alientation,ISMI_Stere,ISMI_Discr,ISMI_Withdrawal,ISMI_Stigmar) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 367 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 367 rows containing missing values (`geom_point()`).

For some reason, the rescored stigma resistance is a negative
correlation
Distress Disclosure Index
Reverse score items 2, 4, 5, 8, 9, 10. Then sum the 12 items. Higher
scores indicate a higher tendency to disclose distress, lower scores
indicate greater concealment of distress.
ddi<-ddi %>% mutate(across(c(DDI_2,DDI_4,DDI_5,DDI_8,DDI_9,DDI_10),~6-.)) %>%
rowwise() %>% mutate(DDI_Total=sum(c_across(DDI_1:DDI_12))) %>%
ungroup()
Warning in as_tibble.data.frame(data) :
restarting interrupted promise evaluation
Error in as_tibble.data.frame(data) :
cannot open file 'C:/Users/Natas/OneDrive - George Mason University - O365 Production/ResearchStudies/01-MHHS/renv/staging/1/pkgconfig/R/pkgconfig.rdb': No such file or directory
#BFNE
Consists of 12 items, range 1-5 Items 2, 4, 7, and 10 are reverse
scored Forward= c(‘BFNE_1’, ‘BFNE_3’, ‘BFNE_5’, ‘BFNE_6’, ‘BFNE_8’,
‘BFNE_9’, ‘BFNE_11’, ‘BFNE_12’), Reverse= c(‘BFNE_2’, ‘BFNE_4’,
‘BFNE_7’, ‘BFNE_10’)
bfne<-mhhs_data %>% select(contains("bfne"))
bfne<-bfne %>% mutate(across(c(BFNE_2,BFNE_4,BFNE_7,BFNE_10),~6-.))
bfne_scoring<-bfne %>% dplyr::select(BFNE_1:BFNE_12)
key_bfne.list<-list(Total=c(1:12))
key_bfne<-make.keys(12,key_bfne.list,colnames(bfne_scoring))
scales_bfne<-scoreItems(key_bfne.list,bfne_scoring)
summary(scales_bfne)
Trust respect scale
8 questions 1-strongly disagree; 7 - strongly agree 2,3,5,6
reverse-scored
trs<-mhhs_data %>% select(contains("trs"))
trs<-trs %>% mutate(across(c(TRS_2,TRS_3,TRS_5,TRS_6),~8-.))
trs_scoring<-trs %>% dplyr::select(TRS_1:TRS_8)
key_trs.list<-list(Total=c(1:8))
key_trs<-make.keys(8,key_trs.list,colnames(trs_scoring))
scales_trs<-scoreItems(key_trs.list,trs_scoring)
summary(scales_trs)
Call: scoreItems(keys = key_trs.list, items = trs_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.91
trs %>% select(TRS_1:TRS_8) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 390 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 390 rows containing missing values (`geom_point()`).

Trust in Physician Scale
1 (strongly disagree)- 5 (strongly agree) 11 items, unweighted mean
of response reverse scored - 1, 5, 7, 11 original scale alpha = .90
Summary score of medical skepticism was obtained by taking the
unweighted mean of the four items.
tps<-mhhs_data %>% select(contains("tps"))
tps<-tps %>% mutate(across(c(TPS_1,TPS_5,TPS_7,TPS_11),~6-.)) %>%
rowwise() %>% mutate(TPS_Tot=sum(c_across(TPS_1:TPS_11))) %>%
ungroup()
#selecting the write-ins
tps %>% filter(TPS_O!="") %>% select(TPS_O)
tps_scoring<-tps %>% dplyr::select(TPS_1:TPS_11)
key_tps.list<-list(Total=c(1:11))
key_tps<-make.keys(11,key_tps.list,colnames(tps_scoring))
scales_tps<-scoreItems(key_tps.list,tps_scoring)
summary(scales_tps)
Call: scoreItems(keys = key_tps.list, items = tps_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.89
tps %>% select(TPS_1:TPS_11) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 705 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 705 rows containing missing values (`geom_point()`).

Ethnic Identity Scale
reverse score 4,5,8
eis<-mhhs_data %>% select(contains("eis"))
# identity questions
eis_id<-eis %>% select(EIS_RE1:EIS_HORIGIN_3_TEXT)
eis_resp<-eis %>% select(!EIS_RE1:EIS_HORIGIN_3_TEXT)
# observe the write-ins
eis_id %>% filter(EIS_RE1_7_TEXT!="") %>% select(EIS_RE1_7_TEXT)
eis_id %>% filter(EIS_HORIGIN_3_TEXT!="") %>% select(EIS_HORIGIN_3_TEXT)
# selecting responses only
eis_resp<-eis_resp %>% mutate(across(c(EIS_Ethni_4,EIS_Ethni_5,EIS_Ethni_8),~5-.)) %>%
rowwise() %>% mutate(EIS_Tot=sum(c_across(EIS_Ethni_1:EIS_Ethni_9))) %>%
ungroup()
eis_scoring<-eis_resp %>% dplyr::select(EIS_Ethni_1:EIS_Ethni_9)
key_eis.list<-list(Total=c(1:9))
key_eis<-make.keys(9,key_eis.list,colnames(eis_scoring))
scales_eis<-scoreItems(key_eis.list,eis_scoring)
summary(scales_eis)
Call: scoreItems(keys = key_eis.list, items = eis_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.82
eis_resp %>% select(EIS_Ethni_1:EIS_Ethni_9) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 547 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation: colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?
Warning: Removed 547 rows containing missing values (`geom_point()`).

Everyday Iniquity - Content
bicf<-mhhs_data %>% select(contains("bicf"))
10 items 1=sd 5 =sa
The numbering is a little odd on the original scale. There’s only 10
items numbered to 14. 7 = 5 8 = 6 11 = 7 12 = 8 13 = 9 14 = 10 reverse
score 7, 8, 11, 12, 13, 14 only for total subscale mean Harmony: 1,
2, 3, 6 Higher scores mean higher harmony (affective) Conflict: 7,
8, 11, 12, 13, 14 Items 2 and 8 are only asked for participants who
self-identified as bicultural.
summary(scales_BICII)
Call: scoreItems(keys = key_BICII.list, items = BICII_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.89
Tosca-3
Relationship assessment scale
Self-concealment
MINI-IPIP
Combining scales for projects
kayleighdata<-cbind(mhhs_data$ResponseId,demographics,bicii,eis,ghsql,ismi,trs,tps)
Error in cbind(mhhs_data$ResponseId, demographics, bicii, eis, ghsql, :
object 'demographics' not found
LS0tDQp0aXRsZTogIk1ISFMgU2NvcmluZyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIGxvYWQgbGlicmFyaWVzfQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShhcGFUYWJsZXMpDQpsaWJyYXJ5KHRhYmxlb25lKQ0KbGlicmFyeShkcGx5cikNCg0KYGBgDQoNCmBgYHtyIGNsZWFuIHF1YWx0cmljcyBoZWFkaW5nc30NCiMgTm90ZSB0aGF0IHRoZXJlJ3MgYSBwYWNrYWdlIHRoYXQgZG9lcyB0aGlzIHNtb290aGx5LiBOZWVkIHRvIGFkZCBpdCBhcyBhbiBhbHRlcm5hdGl2ZSBhdCBzb21lIHBvaW50DQoNCiNjb2x1bW5OYW1lczwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFKVsxLF0NCg0KI3F1YWxfZGF0YTwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFLGNvbC5uYW1lcyA9IGNvbHVtbk5hbWVzKVstYygxOjMpLF0NCg0KIyB3cml0ZSBhIG5ldyB2ZXJzaW9uIHRoYXQgY2FuIGJlIHJlaW1wb3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGNvbHVtbiBjbGFzc2VzDQojd3JpdGUuY3N2KHF1YWxfZGF0YSwiLi4vMDQtUHJvY2Vzc2VkRGF0YS9NSEhTLTFfMTIyMDIwMjNfY2xlYW5oZWFkZXIuY3N2Iixyb3cubmFtZXM9RkFMU0UpDQpgYGANCg0KYGBge3IgbG9hZCBkYXRhfQ0KDQptaGhzX2RhdGE8LXJlYWQuY3N2KCIuLi8wNC1Qcm9jZXNzZWREYXRhL01ISFMtMV8xMjIwMjAyM19jbGVhbmhlYWRlci5jc3YiKQ0KDQpgYGANCg0KYGBge3IgbWV0YWRhdGF9DQojIHNhdmluZyB0aGUgc3RhcnQsIGVuZCwgcHJvZ3Jlc3MsIGR1cmF0aW9uIGV0Yy4NCm1ldGFfZGF0YTwtbWhoc19kYXRhICU+JSBzZWxlY3QoU3RhcnREYXRlOlJlc3BvbnNlSWQsIGNvbnRhaW5zKCJDb25zZW50Iiksc3RhcnRzX3dpdGgoIkFDIikpICU+JSBtdXRhdGUoRHVyYXRpb25faW5fc2Vjb25kcz1EdXJhdGlvbi4uaW4uc2Vjb25kcy4pDQoNCiNzYXZlKG1ldGFfZGF0YSxmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL21ldGFfZGF0YS5SRFMiKQ0KDQpgYGANCg0KYGBge3IgZGVtb2dyYXBoaWNzfQ0KDQojIEtub3cgdGhlIHJhbmdlIG9mIHBvc3NpYmxlIGFuc3dlcnMgZm9yIGVhY2ggZmFjdG9yIGFuZCBtYWtlIHN1cmUgdG8gaW5jbHVkZSBOQQ0KDQptaGhzX2RlbW90Ymw8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KFJhY2VfRXRobjIsQklDXzEsTEFOR18xLEVEVUNfUGFyLEVEVUNfU2VsZixHRU5ERVIsU0VYT1IsTUlMSVQsSU5DT01FKSAlPiUgDQptdXRhdGUoDQpSYWNlX0V0aG4yPWZhY3RvcihSYWNlX0V0aG4yLGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJXaGl0ZSIsIkJsYWNrIiwiSGlzcGFuaWMiLCJBc2lhbiIsIkFtZXJJbmRpYW4iLCJQYWNpZmljSXNsYW5kZXIiLCJNdWx0aXJhY2lhbCIpLGV4Y2x1ZGU9TlVMTCksIA0KQklDXzE9ZmFjdG9yKEJJQ18xLCBsZXZlbHM9YyhOQSwwLDEpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJOb3RCaWN1bHR1cmFsIiwiQmljdWx0dXJhbCIpLGV4Y2x1ZGU9TlVMTCksIA0KTEFOR18xPWZhY3RvcihMQU5HXzEsIGxldmVscz1jKE5BLDAsMSksbGFiZWxzPWMoIk5vdCBBbnN3ZXJlZCIsIkVuZ2xpc2ggYXQgSG9tZSIsIkFkZGl0aW9uYWwgTGFuZ3VhZ2UgYXQgSG9tZSIpLGV4Y2x1ZGU9TlVMTCksIA0KRURVQ19QYXI9ZmFjdG9yKEVEVUNfUGFyLGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcpLGxhYmVscyA9IGMoIk5vdCBhbnN3ZXJlZCIsIjxIaWdoIFNjaG9vbCIsIkhpZ2ggU2Nob29sIiwiU29tZSBjb2xsZWdlIiwiQXNzb2NpYXRlcyIsIkJhY2hlbG9ycyIsIk1hc3RlcnMiLCJEb2N0b3JhbC9Qcm9mZXNzaW9uYWwiKSxleGNsdWRlID0gTlVMTCksDQpFRFVDX1NlbGY9ZmFjdG9yKEVEVUNfU2VsZixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHMgPSBjKCJOb3QgYW5zd2VyZWQiLCI8SGlnaCBTY2hvb2wiLCJIaWdoIFNjaG9vbCIsIlNvbWUgY29sbGVnZSIsIkFzc29jaWF0ZXMiLCJCYWNoZWxvcnMiLCJNYXN0ZXJzIiwiRG9jdG9yYWwvUHJvZmVzc2lvbmFsIiksZXhjbHVkZT1OVUxMKSwgDQpHRU5ERVI9ZmFjdG9yKEdFTkRFUixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHM9YygiTm90IGFuc3dlcmVkIiwiY2lzLXdvbWFuIiwiY2lzLW1hbiIsInRyYW5zIHdvbWFuIiwidHJhbnMgbWFuIiwibm9uLWJpbmFyeSIsInNlbGYtaWQiLCJwcmVmZXIgbm90IHRvIHJlc3BvbmQiKSxleGNsdWRlPU5VTEwpLCANClNleHVhbE9yaWVudGF0aW9uPWZhY3RvcihTRVhPUiwgbGV2ZWxzPWMoTkEsMSwyLDMsNCw1LDYsNyw4KSwgbGFiZWxzID0gYygiTm90IEFuc3dlcmVkIiwiU3RyYWlnaHQiLCJCaXNleHVhbCIsIkdheSIsIkxlc2JpYW4iLCJRdWVlciIsIlF1ZXN0aW9uaW5nIiwiU2VsZi1JRCIsIlByZWZlciBub3QgdG8gcmVzcG9uZCIpLGV4Y2x1ZGUgPSBOVUxMKSwgDQpNaWxpdGFyeVNlcnZpY2U9ZmFjdG9yKE1JTElULGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcsOCksbGFiZWxzPWMoIk5vdCBhbnN3ZXJlZCIsIk5ldmVyIFNlcnZlZCIsIkFjdGl2ZSBEdXR5IiwiTmF0aW9uYWwgR3VhcmQiLCJNaWxpdGFyeSBTcG91c2UiLCJNaWxpdGFyeSBEZXBlbmRlbnQiLCJWZXRlcmFuIiwiT3RoZXIiLCJQcmVmZXIgbm90IHRvIHJlc3BvbmQiKSxleGNsdWRlPU5VTEwpLA0KICBJbmNvbWU9ZmFjdG9yKElOQ09NRSxsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiksbGFiZWxzPWMoIk5vdCBhbnN3ZXJlZCIsIkxlc3MgdGhhbiAxMGsiLCIxMCwwMDAtMjAsMDAwIiwiMjAsMDAwLTUwLDAwMCIsIjUwLDAwMC0xMDAsMDAwIiwiMTAwLDAwMC0xNTAsMDAwIiwiMTUwLDAwMCsiKSxleGNsdWRlID0gTlVMTCkpICU+JSANCnNlbGVjdCgtTUlMSVQsLVNFWE9SKQ0KDQpDcmVhdGVUYWJsZU9uZShkYXRhPW1oaHNfZGVtb3RibCkNCg0KI3NhdmUobWhoc19kZW1vdGJsLGZpbGU9Ii4uLzA0LVByb2Nlc3NlZERhdGEvRGVtb3RhYmxlLlJEUyIpDQpgYGANCg0KIyBQUk9NSVNfR2xvYmFsIHYxLjINClRvIHNjb3JlIHRoZSBQUk9NSVNfR2xvYmFsOg0KRmlyc3QgY2hlY2sgaWYgc3VydmV5IGNvZGVkIEV4Y2VsbGVudCBhcyAxIG9yIGFzIDUuIFF1YWx0cmljcyB3aWxsIG9mdGVuIHJldmVyc2UgdGhlbS4gSGlnaGVyIHNjb3JlcyBzaG91bGQgcmVmbGVjdCBiZXR0ZXIgZnVuY3Rpb25pbmcuDQoNClBST01JU19HbG9iYWwxXzE6UFJPTUlTX0dsb2JhbDFfNzogSXRlbXMgcmF0ZWQgZnJvbSA1IChleGNlbGxlbnQpIHRvIDEgKE5vdCBhdCBhbGwpIG9uIG9yaWdpbmFsIHNjYWxlOw0KUFJPTUlTX0dsb2JhbDFfMTpQUk9NSVNfR2xvYmFsMV83IGFyZSByZXZlcnNlZCBmcm9tIFF1YWx0cmljcyAxLTUgZGVmYXVsdHMNCg0KUFJPTUlTX0dsb2JhbDJfMTogZW1vdGlvbmFsIHByb2JsZW1zOyBwYXN0IDcgZGF5czsgNSAobmV2ZXIpIHRvIDEgKGFsd2F5cyk7IChnbG9iYWwgMTApDQpQUk9NSVNfR2xvYmFsMl8yOiBmYXRpZ3VlOyBwYXN0IDcgZGF5cyAoZ2xvYmFsIDA4KQ0KDQpQUk9NSVNfR2xvYmFsM18xOiBwYWluLiA1PTAsIDQ9MTozLCAzPTQ6NiwgMj03OjksIDE9MTANCg0KRm9yIHNjb3JpbmcsICAiMiBxdWVzdGlvbnMgd2VyZSBleGNsdWRlZCBmcm9tIHRoZSBjYWxjdWxhdGlvbi9ldmFsdWF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoZSBxdWVzdGlvbm5haXJlIGRldmVsb3BtZW50IHN0dWR5OiBHbG9iYWwwMSBiZWNhdXNlIG9mIGl0cyBzdGF0aXN0aWNhbCBjb25ncnVlbmNlIHdpdGggR2xvYmFsMDMuIEdsb2JhbDA5ciBiZWNhdXNlIG9mIGl0cyBhcHByb3hpbWF0ZWx5IGVxdWFsIHN0YXRpc3RpY2FsIGNvcnJlbGF0aW9uIHRvIHBoeXNpY2FsIGFuZCBtZW50YWwgaGVhbHRoLiINCg0KVGhlIEdsb2JhbCBQaHlzaWNhbCBIZWFsdGggc2NvcmUgaXMgZ2VuZXJhdGVkIGJ5IHN1bW1pbmcgcmVzcG9uc2VzIHRvDQpHbG9iYWwwMyAoUFJPTUlTX0dsb2JhbDFfMyksIEdsb2JhbDA2IChQUk9NSVNfR2xvYmFsMV83KSwgR2xvYmFsMDdyZXNjb3JlZCAoUFJPTUlTX0dsb2JhbDNfMSksIGFuZCBHbG9iYWwwOHJlc2NvcmVkIChQUk9NSVNfR2xvYmFsMl8yKS4gVGhlIEdsb2JhbCBNZW50YWwgSGVhbHRoIHNjb3JlDQppcyBnZW5lcmF0ZWQgYnkgc3VtbWluZyByZXNwb25zZXMgdG8gR2xvYmFsMDIgKFBST01JU19HbG9iYWwxXzIpLCBHbG9iYWwwNCAoUFJPTUlTX0dsb2JhbDFfNCksIEdsb2JhbDA1KFBST01JU19HbG9iYWwxXzUpLCBhbmQgR2xvYmFsMTByZXNjb3JlZCAoUFJPTUlTX0dsb2JhbDJfMSkNCg0KYGBge3IgUFJPTUlTfQ0KcHJvbWlzX2dsb2JhbDwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIlBST01JUyIpKQ0KDQojc2NvcmUgaXRlbXMgc28gdGhhdCBoaWdoZXIgc2NvcmVzIHJlZmxlY3QgYmV0dGVyIGZ1bmN0aW9uaW5nIA0KDQojIHBhaW4gaXRlbTogNT0wLCA0PTE6MywgMz00OjYsIDI9Nzo5LCAxPTEwDQoNCiMgcmVuYW1pbmcgdGhlIFByb21pcyB0byBtYXRjaCB0aGUgb3JpZ2luYWwgbWVhc3VyZQ0KDQpwcm9taXNfZ2xvYmFsPC1wcm9taXNfZ2xvYmFsICU+JSByZW5hbWVfd2l0aCh+c3ByaW50ZigiUFJPTUlTX0dsb2JhbDAlZCIsMTo1KSwuY29scz1jKFBST01JU19HbG9iYWwxXzE6UFJPTUlTX0dsb2JhbDFfNSkpICU+JSAgcmVuYW1lKFBST01JU19HbG9iYWwwOT1QUk9NSVNfR2xvYmFsMV82LFBST01JU19HbG9iYWwwNj1QUk9NSVNfR2xvYmFsMV83LCBQUk9NSVNfR2xvYmFsMTA9UFJPTUlTX0dsb2JhbDJfMSwgUFJPTUlTX0dsb2JhbDA4PVBST01JU19HbG9iYWwyXzIsUFJPTUlTX0dsb2JhbDA3PVBST01JU19HbG9iYWwzXzEpJT4lIG11dGF0ZShhY3Jvc3MoYyhQUk9NSVNfR2xvYmFsMDE6UFJPTUlTX0dsb2JhbDA4KSx+Ni0uKSkgJT4lIA0KICBtdXRhdGUoUFJPTUlTX0dsb2JhbDA3PXJlY29kZShQUk9NSVNfR2xvYmFsMDcsYDBgPTUsYDFgPTQsYDJgPTQsYDNgPTQsYDRgPTMsYDVgPTMsYDZgPTMsYDdgPTIsYDhgPTIsYDlgPTIsYDEwYD0xKSklPiUgDQogIHJvd3dpc2UoKSAlPiUgIG11dGF0ZShQR19QaHlzSGVhbHRoPXN1bShjKFBST01JU19HbG9iYWwwMyxQUk9NSVNfR2xvYmFsMDYsUFJPTUlTX0dsb2JhbDA3LFBST01JU19HbG9iYWwwOCkpLFBHX01lbnRIZWFsdGg9c3VtKGMoUFJPTUlTX0dsb2JhbDAyLFBST01JU19HbG9iYWwwNCxQUk9NSVNfR2xvYmFsMDUsUFJPTUlTX0dsb2JhbDEwKSkpICU+JSB1bmdyb3VwKCkNCg0KcHJvbWlzX2dsb2JhbF9zY29yaW5nPC1wcm9taXNfZ2xvYmFsICU+JSBzZWxlY3QoLVBST01JU19HbG9iYWwwMSwgLVBST01JU19HbG9iYWwwOSwtUEdfUGh5c0hlYWx0aCwtUEdfTWVudEhlYWx0aCkNCg0Ka2V5X3Byb21pcy5saXN0PC1saXN0KFBIPWMoIlBST01JU19HbG9iYWwwMyIsIlBST01JU19HbG9iYWwwNiIsIlBST01JU19HbG9iYWwwNyIsIlBST01JU19HbG9iYWwwOCIpLE1IPWMoIlBST01JU19HbG9iYWwwMiIsIlBST01JU19HbG9iYWwwNCIsIlBST01JU19HbG9iYWwwNSIsIlBST01JU19HbG9iYWwxMCIpKQ0KDQprZXlfcHJvbWlzPC1tYWtlLmtleXMobnZhcnM9OCxrZXlfcHJvbWlzLmxpc3QsaXRlbS5sYWJlbHMgPSBjb2xuYW1lcyhwcm9taXNfZ2xvYmFsX3Njb3JpbmcpKQ0Kc2NhbGVzX3Byb21pczwtc2NvcmVJdGVtcyhrZXlfcHJvbWlzLHByb21pc19nbG9iYWxfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX3Byb21pcykNCg0KYGBgDQoNCiMgR0hTUUwNCkdIU1FMIGhhcyBvbmUgb3Blbi1yZXNwb25zZSBpdGVtLiBUaGlzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBzY29yZS4gU2NvcmluZyBhbHNvIHNlZW1zIHNvbWV3aGF0IGZsZXhpYmxlIGFuZCBpbmNsdWRlcyBpbmZvcm1hbC9mb3JtYWw7IHBlcnNvbmFsLWVtb3Rpb25hbC9zdWljaWRlOyBoZWxwIGZyb20gYW55b25lL0hlbHAgZnJvbSBuby1vbmUuDQoNClJhbmdlIDEtNyAoRXh0cmVtZWx5IHVubGlrZWx5IHRvIEV4dHJlbWVseSBMaWtlbHkpDQoNCmBgYHtyIEdIU1FMfQ0KZ2hzcWw8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJHSFNRTCIpKQ0KDQpnaHNxbDwtZ2hzcWwgJT4lIG11dGF0ZShHZW5lcmFsPXJvd1N1bXMoKHNlbGVjdChnaHNxbCxHSFNRTF9QZXJzXzE6R0hTUUxfUGVyc185LEdIU1FMX1NVSV8xOkdIU1FMX1NVSV85KSkpKSAlPiUgDQogcm93d2lzZSgpICU+JSAgDQogIG11dGF0ZShQZXJzb25hbD1zdW0oY19hY3Jvc3MoR0hTUUxfUGVyc18xOkdIU1FMX1BlcnNfOCkpLA0KICAgICAgICAgU3VpY2lkZT1zdW0oY19hY3Jvc3MoR0hTUUxfU1VJXzE6R0hTUUxfU1VJXzgpKSwNCiAgICAgICAgIEluZm9ybWFsX2FsbD1zdW0oYyhHSFNRTF9QZXJzXzEsR0hTUUxfU1VJXzEsR0hTUUxfUGVyc18yLEdIU1FMX1NVSV8yLEdIU1FMX1BlcnNfMyxHSFNRTF9TVUlfMyxHSFNRTF9QZXJzXzQsR0hTUUxfU1VJXzQpKSwNCiAgICAgICAgIEZvcm1hbF9hbGw9c3VtKGMoR0hTUUxfUGVyc181LEdIU1FMX1NVSV81LEdIU1FMX1BlcnNfNixHSFNRTF9TVUlfNixHSFNRTF9QZXJzXzcsR0hTUUxfU1VJXzcsR0hTUUxfUGVyc184LEdIU1FMX1NVSV84KSksDQogICAgICAgICBOb25lX2FsbD1zdW0oYyhHSFNRTF9QZXJzXzksR0hTUUxfU1VJXzkpKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lICNyZW1vdmUgcm93d2lzZSBncm91cGluZyANCiAgbXV0YXRlKFBlcnNvbmFsX3o9c2NhbGUoUGVyc29uYWwpLFN1aWNpZGVfej1zY2FsZShTdWljaWRlKSxJbmZvcm1hbF9hbGxfej1zY2FsZShJbmZvcm1hbF9hbGwpLEZvcm1hbF9hbGxfej1zY2FsZShGb3JtYWxfYWxsKSxOb25lX2FsbF96PXNjYWxlKE5vbmVfYWxsKSkNCg0KI21ha2UgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBpdGVtcyB0byBiZSBzY29yZWQvdGhhdCBuZWVkIHJlbGlhYmlsaXR5DQpnaHNxbF9zY29yaW5nPC1naHNxbCAlPiUgZHBseXI6OnNlbGVjdCgxOjksMTI6MjApDQprZXlfZ2hzcWwubGlzdDwtbGlzdChHZW5lcmFsPWMoMToxOCksUGVyc29uYWw9YygxOjkpLFN1aWNpZGU9YygxMDoxOCksRm9ybWFsPWMoNSwxNCw2LDE1LDcsMTYsOCwxNyksSW5mb3JtYWw9YygxLDEwLDIsMTEsMywxMiw0LDEzKSkNCmtleV9naHNxbDwtbWFrZS5rZXlzKDE4LGtleV9naHNxbC5saXN0LGNvbG5hbWVzKGdoc3FsX3Njb3JpbmcpKQ0KDQpzY2FsZXNfZ2hzcWw8LXNjb3JlSXRlbXMoa2V5X2doc3FsLmxpc3QsZ2hzcWxfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX2doc3FsKQ0KDQojaGlzdG9ncmFtIHRvIGV4cGxvcmUgdGhlIHJhbmdlIA0KZ2hzcWwgJT4lIHNlbGVjdChHSFNRTF9QZXJzXzE6R0hTUUxfUGVyc185KSAlPiUgZ2F0aGVyKCkgJT4lIGdncGxvdChhZXMoeT12YWx1ZSx4PWtleSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJJbnRpbWF0ZSBwYXJ0bmVyIiwgIkZyaWVuZCIsIlBhcmVudCIsIk90aGVyIHJlbGF0aXZlIiwiTUhQIiwiUGhvbmUgaGVscGxpbmUiLCJEb2N0b3IiLCJNaW5pc3RlciIsIk5vdCBzZWVrIGhlbHAiKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCg0KZ2hzcWwgJT4lIHNlbGVjdChHSFNRTF9TVUlfMTpHSFNRTF9TVUlfOSkgJT4lIGdhdGhlcigpICU+JSBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXkpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiSW50aW1hdGUgcGFydG5lciIsICJGcmllbmQiLCJQYXJlbnQiLCJPdGhlciByZWxhdGl2ZSIsIk1IUCIsIlBob25lIGhlbHBsaW5lIiwiRG9jdG9yIiwiTWluaXN0ZXIiLCJOb3Qgc2VlayBoZWxwIikpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpDQoNCmdoc3FsICU+JSBzZWxlY3QoSW5mb3JtYWxfYWxsX3osRm9ybWFsX2FsbF96LE5vbmVfYWxsX3opICU+JSBnYXRoZXIoKSAlPiUgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5KSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkluZm9ybWFsIChQZXJzICsgU3VpKSIsIkZvcm1hbCAoUGVycyArIFN1aSkiLCJOb25lIChQZXJzICsgU3VpKSIpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKQ0KDQpnaHNxbCAlPiUgc2VsZWN0KEdIU1FMX1BlcnNfMTBfVEVYVCxHSFNRTF9TVUlfMTBfVEVYVCkgJT4lIGZpbHRlcihHSFNRTF9QZXJzXzEwX1RFWFQhPSIifEdIU1FMX1NVSV8xMF9URVhUIT0iIikNCg0KYGBgDQoNCiMgREFTUzIxDQoNClN0cmVzcyBpdGVtcyBhcmUgMSwgNiwgOCwgMTEsIDEyLCAxNCwgMTgNCkFueGlldHkgaXRlbXMgYXJlIDIsIDQsIDcsIDksIDE1LCAxOSwgMjAsICANCkRlcHJlc3Npb24gaXRlbXMgYXJlIDMsIDUsIDEwLCAxMywgMTYsIDE3LCAyMSANCg0KVGhlIGRlcHJlc3Npb24gc2NhbGUgYXNzZXNzZXMgZHlzcGhvcmlhLCBob3BlbGVzc25lc3MsIGRldmFsdWF0aW9uIG9mIGxpZmUsIHNlbGYtZGVwcmVjYXRpb24sIGxhY2sgb2YgaW50ZXJlc3QgLyBpbnZvbHZlbWVudCwgYW5oZWRvbmlhIGFuZCBpbmVydGlhLiANCg0KVGhlIGFueGlldHkgc2NhbGUgYXNzZXNzZXMgYXV0b25vbWljIGFyb3VzYWwsIHNrZWxldGFsIG11c2NsZSBlZmZlY3RzLCBzaXR1YXRpb25hbCBhbnhpZXR5LCBhbmQgc3ViamVjdGl2ZSBleHBlcmllbmNlIG9mIGFueGlvdXMgYWZmZWN0LiANClRoZSBzdHJlc3Mgc2NhbGUgaXMgc2Vuc2l0aXZlIHRvIGxldmVscyBvZiBjaHJvbmljIG5vbnNwZWNpZmljIGFyb3VzYWwuIEl0IGFzc2Vzc2VzIGRpZmZpY3VsdHkgcmVsYXhpbmcsIG5lcnZvdXMgYXJvdXNhbCwgYW5kIGJlaW5nIGVhc2lseSB1cHNldCAvIGFnaXRhdGVkLCBpcnJpdGFibGUgLyBvdmVyLXJlYWN0aXZlIGFuZCBpbXBhdGllbnQuIA0KDQpTY29yZXMgZm9yIGRlcHJlc3Npb24sIGFueGlldHkgYW5kIHN0cmVzcyBhcmUgY2FsY3VsYXRlZCBieSBzdW1taW5nIHRoZSBzY29yZXMgZm9yIHRoZSByZWxldmFudCBpdGVtcw0KDQpTY29yZXMgb24gdGhlIERBU1MtMjEgd2lsbCBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMiB0byBjYWxjdWxhdGUgdGhlIGZpbmFsIHNjb3JlIGFuZCBzdGF5IGVxdWl2YWxlbnQgd2l0aCBEQVNTLTQyLg0KYGBge3IgREFTUzIxfQ0KZGFzczwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIkRBU1MiKSkNCg0KZGFzczwtZGFzcyAlPiUgbXV0YXRlKERhc3MyMV9Ub3RhbD1yb3dTdW1zKChzZWxlY3QoZGFzcyxEQVNTMjFfMTpEQVNTMjFfMjEpKSkqMikgJT4lIA0KIHJvd3dpc2UoKSAlPiUgIA0KICBtdXRhdGUoRGFzczIxX1N0cmVzcz1zdW0oREFTUzIxXzEsREFTUzIxXzYsIERBU1MyMV84LERBU1MyMV8xMSxEQVNTMjFfMTIsREFTUzIxXzE0LERBU1MyMV8xOCxuYS5ybSA9IFQpLA0KICAgICAgICAgRGFzczIxX0FueGlldHk9c3VtKERBU1MyMV8yLERBU1MyMV80LERBU1MyMV83LERBU1MyMV85LERBU1MyMV8xNSxEQVNTMjFfMTksREFTUzIxXzIwLCBuYS5ybT1UKSwNCiAgICAgICAgIERhc3MyMV9EZXByZXNzaW9uPXN1bShEQVNTMjFfMyxEQVNTMjFfNSxEQVNTMjFfMTAsREFTUzIxXzEzLERBU1MyMV8xNixEQVNTMjFfMTcsREFTUzIxXzIxLCBuYS5ybT1UKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShEYXNzMjFfU3RyZXNzX3o9c2NhbGUoLiwpKSAlPiUNCiAgbXV0YXRlKERlcF9jdXRzPWNhc2Vfd2hlbihEYXNzMjFfRGVwcmVzc2lvbjwxMH4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb248MTR+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfRGVwcmVzc2lvbjwyMX4iTW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfRGVwcmVzc2lvbjwyOH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb24+Mjd+IkV4dHJlbWVseV9TZXZlcmUiKSwNCiAgICAgICAgICAgICAgICBBbnhfY3V0cz1jYXNlX3doZW4oRGFzczIxX0FueGlldHk8OH4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk8MTB+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfQW54aWV0eTwxNX4iTW9kZXJhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfQW54aWV0eTwyMH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk+MTl+IkV4dHJlbWVseV9TZXZlcmUiKSwNCiAgICAgICAgICAgICAgICBTdHJlc3NfY3V0cz1jYXNlX3doZW4oRGFzczIxX1N0cmVzczwxNX4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzczwxOX4iTWlsZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9TdHJlc3M8MjZ+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzczwzNH4iU2V2ZXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX1N0cmVzcz4zM34iRXh0cmVtZWx5X1NldmVyZSIpKQ0KDQoNCiNtYWtlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgaXRlbXMgdG8gYmUgc2NvcmVkL3RoYXQgbmVlZCByZWxpYWJpbGl0eQ0KZGFzc19zY29yaW5nPC1kYXNzICU+JSBkcGx5cjo6c2VsZWN0KERBU1MyMV8xOkRBU1MyMV8yMSkNCmtleV9kYXNzLmxpc3Q8LWxpc3QoU3RyZXNzPWMoMSw2LDgsMTEsMTIsMTQsMTgpLEFueGlldHk9YygyLDQsNyw5LDE1LDE5LDIwKSxEZXByZXNzaW9uPWMoMyw1LDEwLDEzLDE2LDE3LDIxKSkNCg0Ka2V5X2Rhc3M8LW1ha2Uua2V5cygyMSxrZXlfZGFzcy5saXN0LGNvbG5hbWVzKGRhc3Nfc2NvcmluZykpDQoNCnNjYWxlc19kYXNzPC1zY29yZUl0ZW1zKGtleV9kYXNzLmxpc3QsZGFzc19zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfZGFzcykNCg0KI2hpc3RvZ3JhbSB0byBleHBsb3JlIHRoZSByYW5nZSANCmRhc3MgJT4lIHNlbGVjdChEYXNzMjFfU3RyZXNzLERhc3MyMV9BbnhpZXR5LCBEYXNzMjFfRGVwcmVzc2lvbikgJT4lIGdhdGhlcigpICU+JSBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXkpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiU3RyZXNzIiwiQW54aWV0eSIsIkRlcHJlc3Npb24iKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCg0KI3NjYXR0ZXJwbG90IHRvIGNvbG9yIHRoZSBjdXRvZmZzDQpkYXNzX3NldmVyaXR5PC1kYXNzICU+JSAgc2VsZWN0KERhc3MyMV9TdHJlc3MsRGFzczIxX0FueGlldHksIERhc3MyMV9EZXByZXNzaW9uKSAlPiUgDQpwaXZvdF9sb25nZXIoY29scz1zdGFydHNfd2l0aCgiRGFzczIxIiksbmFtZXNfdG8gPSAiU3Vic2NhbGUiLHZhbHVlc190byA9ICJzY29yZSIpICU+JSAgIG11dGF0ZShDdXRzPWNhc2Vfd2hlbigoU3Vic2NhbGU9PSJEYXNzMjFfRGVwcmVzc2lvbiIgJiBzY29yZTwxMCkgfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwxNCl+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwyMSl+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9EZXByZXNzaW9uIiYgc2NvcmU8MjgpfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZT4yNyl+IkV4dHJlbWVseV9TZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDgpfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDEwKX4iTWlsZCIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MTUpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MjApfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPjE5KX4iRXh0cmVtZWx5X1NldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0iRGFzczIxX1N0cmVzcyImIHNjb3JlPDE1KX4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MTkpfiJNaWxkIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MjYpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZTwzNCl+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZT4zMyl+IkV4dHJlbWVseV9TZXZlcmUiKSkNCg0KICANCiNzZXZlcml0eSBoaXN0b2dyYW0gY29sb3JlZCBieSBzZXZlcml0eQ0KZGFzc19zY2F0dGVyICU+JSBnZ3Bsb3QoYWVzKHNjb3JlLGZpbGw9U3Vic2NhbGUsZ3JvdXA9U3Vic2NhbGUpKStnZW9tX2JhcigpDQoNCiNqaXR0ZXIgcGxvdCBjb2xvcmVkIGJ5IHNldmVyaXR5DQpkYXNzX3NjYXR0ZXIgJT4lIGdncGxvdChhZXMoeD1TdWJzY2FsZSx5PXNjb3JlLGNvbG91cj1DdXRzKSkrZ2VvbV9qaXR0ZXIoKSt0aGVtZV9jbGFzc2ljKCkrc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpDQpgYGANCiMgSVNNSTI5DQoyOS1pdGVtIG1lYXN1cmUgYXNzZXNzaW5nIHNlbGYgc3RpZ21hIG9mIG1lbnRhbCBpbGxuZXNzLiBJbmNsdWRlcyBzdWJzY2FsZXM6IGFsaWVuYXRpb24sIHN0ZXJlb3R5cGUgZW5kb3JzZW1lbnQsIGRpc2NyaW1pbmF0aW9uIGV4cGVyaWVuY2UsIHNvY2lhbCB3aXRoZHJhd2FsLCBzdGlnbWEgcmVzaXN0YW5jZS4gU2NvcmVkIGZyb20gMS00LiBUaGUgZW50aXJlIFN0aWdtYSByZXNpc3RhbmNlIHN1YnNjYWxlIGlzIHJldmVyc2Ugc2NvcmVkLg0KDQpUcmFkaXRpb25hbCBzY29yaW5nIGlzIGRpY2hvdG9tb3VzIGFuZCB1c2VzIG1lYW5zLiANCg0KYGBge3IgSVNNSSAyOX0NCmlzbWk8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJJU01JIikpDQoNCmlzbWk8LWlzbWkgJT4lIHJvd3dpc2UoKSAlPiUgIA0KICBtdXRhdGUoSVNNSV9BbGllbnRhdGlvbj1zdW0oSVNNSTI5XzEsSVNNSTI5XzUsSVNNSTI5XzgsSVNNSTI5XzE2LElTTUkyOV8xNyxJU01JMjlfMjEpLA0KICAgICAgICAgSVNNSV9TdGVyZT1zdW0oSVNNSTI5XzIsIElTTUkyOV82LElTTUkyOV8xMCxJU01JMjlfMTgsSVNNSTI5XzE5LElTTUkyOV8yMyxJU01JMjlfMjkpLA0KICAgICAgICAgSVNNSV9EaXNjcj1zdW0oSVNNSTI5XzMsSVNNSTI5XzE1LElTTUkyOV8yMixJU01JMjlfMjUsSVNNSTI5XzI4KSwNCiAgICBJU01JX1dpdGhkcmF3YWw9c3VtKElTTUkyOV80LElTTUkyOV85LElTTUkyOV8xMSxJU01JMjlfMTIsSVNNSTI5XzEzLElTTUkyOV8yMCkpICU+JSANCiAgICAgIG11dGF0ZShJU01JMjlfNz1yZWNvZGUoSVNNSTI5XzcsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgICAgSVNNSTI5XzE0PXJlY29kZShJU01JMjlfMTQsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgSVNNSTI5XzI0PXJlY29kZShJU01JMjlfMjQsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgIElTTUkyOV8yNj1yZWNvZGUoSVNNSTI5XzI2LGAxYD00LGAyYD0zLGAzYD0yLGA0YD0xKSwNCiAgICAgICAgIElTTUkyOV8yNz1yZWNvZGUoSVNNSTI5XzI3LGAxYD00LGAyYD0zLGAzYD0yLGA0YD0xKSkgJT4lICANCiAgICAgIG11dGF0ZShJU01JX1N0aWdtYXI9c3VtKElTTUkyOV83LElTTUkyOV8xNCxJU01JMjlfMjQsSVNNSTI5XzI2LElTTUkyOV8yNykpICU+JSANCiAgdW5ncm91cCgpDQoNCg0KI21ha2UgYSBkYXRhZnJhbWUgd2l0aCBvbmx5IHRoZSBpdGVtcyB0byBiZSBzY29yZWQvdGhhdCBuZWVkIHJlbGlhYmlsaXR5DQppc21pX3Njb3Jpbmc8LWlzbWkgJT4lIGRwbHlyOjpzZWxlY3QoSVNNSTI5XzE6SVNNSTI5XzI5KQ0Ka2V5X2lzbWkubGlzdDwtbGlzdChBbGllbj1jKDEsNSw4LDE2LDE3LDIxKSxTdGVyZW90eXBlPWMoMiw2LDEwLDE4LDE5LDIzLDI5KSxEaXNjcmltaW5hdGlvbj1jKDMsMTUsMjIsMjUsMjgpLFdpdGhkcmF3YWw9Yyg0LDksMTEsMTIsMTMsMjApLFN0aWdtYVI9Yyg3LDE0LDI0LDI2LDI3KSkNCg0Ka2V5X2lzbWk8LW1ha2Uua2V5cygyOSxrZXlfaXNtaS5saXN0LGNvbG5hbWVzKGlzbWlfc2NvcmluZykpDQoNCnNjYWxlc19pc21pPC1zY29yZUl0ZW1zKGtleV9pc21pLmxpc3QsaXNtaV9zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfaXNtaSkNCg0KaXNtaSRJU01JMjlfMTQNCmNvcihpc21pJElTTUlfU3RpZ21hcixpc21pJElTTUlfQWxpZW50YXRpb24sdXNlPSJjb21wbGV0ZS5vYnMiKQ0KDQppc21pICU+JSBzZWxlY3QoSVNNSV9BbGllbnRhdGlvbixJU01JX1N0ZXJlLElTTUlfRGlzY3IsSVNNSV9XaXRoZHJhd2FsLElTTUlfU3RpZ21hcikgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQpgYGANCkZvciBzb21lIHJlYXNvbiwgdGhlIHJlc2NvcmVkIHN0aWdtYSByZXNpc3RhbmNlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24NCg0KIyBEaXN0cmVzcyBEaXNjbG9zdXJlIEluZGV4DQoNClJldmVyc2Ugc2NvcmUgaXRlbXMgMiwgNCwgNSwgOCwgOSwgMTAuIFRoZW4gc3VtIHRoZSAxMiBpdGVtcy4gSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGhpZ2hlciB0ZW5kZW5jeSB0byBkaXNjbG9zZSBkaXN0cmVzcywgbG93ZXIgc2NvcmVzIGluZGljYXRlIGdyZWF0ZXIgY29uY2VhbG1lbnQgb2YgZGlzdHJlc3MuDQpgYGB7ciBEREl9DQoNCmRkaTwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIkRESSIpKQ0KDQpkZGk8LWRkaSAlPiUgbXV0YXRlKGFjcm9zcyhjKERESV8yLERESV80LERESV81LERESV84LERESV85LERESV8xMCksfjYtLikpICU+JQ0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShERElfVG90YWw9c3VtKGNfYWNyb3NzKERESV8xOkRESV8xMikpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQpkZGlfc2NvcmluZzwtZGRpICU+JSBkcGx5cjo6c2VsZWN0KERESV8xOkRESV8xMikNCg0Ka2V5X2RkaS5saXN0PC1saXN0KFRvdGFsPWMoMToxMikpDQprZXlfZGRpPC1tYWtlLmtleXMoMTIsa2V5X2RkaS5saXN0LGNvbG5hbWVzKGRkaV9zY29yaW5nKSkNCg0Kc2NhbGVzX2RkaTwtc2NvcmVJdGVtcyhrZXlfZGRpLmxpc3QsZGRpX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19kZGkpDQoNCmRkaSAlPiUgc2VsZWN0KERESV9Ub3RhbCkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KZGRpICU+JSBzZWxlY3QoRERJX1RvdGFsKSAlPiUgYWRkX2NvbHVtbihnaHNxbCAlPiUgc2VsZWN0KFBlcnNvbmFsLFN1aWNpZGUsR2VuZXJhbCxOb25lX2FsbCkpICU+JSBjb3IucGxvdCguKQ0KDQoNCg0KIyBjaGVja2luZyB0aGUgY29ycmVsYXRpb25zIG90IGVuc3VyZSB0aGV5IG1ha2Ugc2Vuc2UNCmNvci50ZXN0KGRkaSRERElfVG90YWwsZ2hzcWwkR2VuZXJhbCkNCmNvci50ZXN0KGRkaSRERElfVG90YWwsZ2hzcWwkUGVyc29uYWwpDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJFN1aWNpZGUpDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJE5vbmVfYWxsKQ0KDQpgYGANCg0KI0JGTkUNCg0KQ29uc2lzdHMgb2YgMTIgaXRlbXMsIHJhbmdlIDEtNQ0KSXRlbXMgMiwgNCwgNywgYW5kIDEwIGFyZSByZXZlcnNlIHNjb3JlZA0KRm9yd2FyZD0gYygnQkZORV8xJywgJ0JGTkVfMycsICdCRk5FXzUnLCAnQkZORV82JywgICdCRk5FXzgnLCAnQkZORV85JywgJ0JGTkVfMTEnLCAnQkZORV8xMicpLCBSZXZlcnNlPSBjKCdCRk5FXzInLCAnQkZORV80JywgJ0JGTkVfNycsICdCRk5FXzEwJykNCmBgYHtyIEJGTkV9DQpiZm5lPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiYmZuZSIpKQ0KDQpiZm5lPC1iZm5lICU+JSBtdXRhdGUoYWNyb3NzKGMoQkZORV8yLEJGTkVfNCxCRk5FXzcsQkZORV8xMCksfjYtLikpDQogICAgICAgICAgICAgICAgICAgICAgDQpiZm5lX3Njb3Jpbmc8LWJmbmUgJT4lIGRwbHlyOjpzZWxlY3QoQkZORV8xOkJGTkVfMTIpDQprZXlfYmZuZS5saXN0PC1saXN0KFRvdGFsPWMoMToxMikpDQprZXlfYmZuZTwtbWFrZS5rZXlzKDEyLGtleV9iZm5lLmxpc3QsY29sbmFtZXMoYmZuZV9zY29yaW5nKSkNCg0Kc2NhbGVzX2JmbmU8LXNjb3JlSXRlbXMoa2V5X2JmbmUubGlzdCxiZm5lX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19iZm5lKQ0KDQpgYGANCg0KIyBUcnVzdCByZXNwZWN0IHNjYWxlDQo4IHF1ZXN0aW9ucyAxLXN0cm9uZ2x5IGRpc2FncmVlOyA3IC0gc3Ryb25nbHkgYWdyZWUNCjIsMyw1LDYgcmV2ZXJzZS1zY29yZWQNCg0KYGBge3IgVFJTfQ0KdHJzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygidHJzIikpDQoNCnRyczwtdHJzICU+JSBtdXRhdGUoYWNyb3NzKGMoVFJTXzIsVFJTXzMsVFJTXzUsVFJTXzYpLH44LS4pKQ0KDQp0cnNfc2NvcmluZzwtdHJzICU+JSBkcGx5cjo6c2VsZWN0KFRSU18xOlRSU184KQ0Ka2V5X3Rycy5saXN0PC1saXN0KFRvdGFsPWMoMTo4KSkNCmtleV90cnM8LW1ha2Uua2V5cyg4LGtleV90cnMubGlzdCxjb2xuYW1lcyh0cnNfc2NvcmluZykpDQoNCnNjYWxlc190cnM8LXNjb3JlSXRlbXMoa2V5X3Rycy5saXN0LHRyc19zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfdHJzKQ0KDQp0cnMgJT4lIHNlbGVjdChUUlNfMTpUUlNfOCkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQoNCmBgYA0KDQojIFRydXN0IGluIFBoeXNpY2lhbiBTY2FsZQ0KDQoxIChzdHJvbmdseSBkaXNhZ3JlZSktIDUgKHN0cm9uZ2x5IGFncmVlKQ0KMTEgaXRlbXMsIHVud2VpZ2h0ZWQgbWVhbiBvZiByZXNwb25zZQ0KcmV2ZXJzZSBzY29yZWQgLSAxLCA1LCA3LCAxMQ0Kb3JpZ2luYWwgc2NhbGUgYWxwaGEgPSAuOTANCg0KU3VtbWFyeSBzY29yZSBvZiBtZWRpY2FsIHNrZXB0aWNpc20gd2FzIG9idGFpbmVkIGJ5IHRha2luZyB0aGUgdW53ZWlnaHRlZCBtZWFuIG9mIHRoZSBmb3VyIGl0ZW1zLiANCmBgYHtyIFRQU30NCg0KdHBzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygidHBzIikpDQoNCnRwczwtdHBzICU+JSBtdXRhdGUoYWNyb3NzKGMoVFBTXzEsVFBTXzUsVFBTXzcsVFBTXzExKSx+Ni0uKSkgJT4lIA0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShUUFNfVG90PXN1bShjX2Fjcm9zcyhUUFNfMTpUUFNfMTEpKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KI3NlbGVjdGluZyB0aGUgd3JpdGUtaW5zDQp0cHMgJT4lIGZpbHRlcihUUFNfTyE9IiIpICU+JSBzZWxlY3QoVFBTX08pDQoNCnRwc19zY29yaW5nPC10cHMgJT4lIGRwbHlyOjpzZWxlY3QoVFBTXzE6VFBTXzExKQ0Ka2V5X3Rwcy5saXN0PC1saXN0KFRvdGFsPWMoMToxMSkpDQprZXlfdHBzPC1tYWtlLmtleXMoMTEsa2V5X3Rwcy5saXN0LGNvbG5hbWVzKHRwc19zY29yaW5nKSkNCg0Kc2NhbGVzX3Rwczwtc2NvcmVJdGVtcyhrZXlfdHBzLmxpc3QsdHBzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc190cHMpDQoNCnRwcyAlPiUgc2VsZWN0KFRQU18xOlRQU18xMSkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQoNCg0KYGBgDQojIEV0aG5pYyBJZGVudGl0eSBTY2FsZQ0KDQpyZXZlcnNlIHNjb3JlIDQsNSw4DQoNCmBgYHtyIEVJU30NCmVpczwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoImVpcyIpKQ0KDQojIGlkZW50aXR5IHF1ZXN0aW9ucw0KZWlzX2lkPC1laXMgJT4lIHNlbGVjdChFSVNfUkUxOkVJU19IT1JJR0lOXzNfVEVYVCkNCmVpc19yZXNwPC1laXMgJT4lIHNlbGVjdCghRUlTX1JFMTpFSVNfSE9SSUdJTl8zX1RFWFQpDQoNCiMgb2JzZXJ2ZSB0aGUgd3JpdGUtaW5zDQplaXNfaWQgJT4lIGZpbHRlcihFSVNfUkUxXzdfVEVYVCE9IiIpICU+JSBzZWxlY3QoRUlTX1JFMV83X1RFWFQpDQplaXNfaWQgJT4lIGZpbHRlcihFSVNfSE9SSUdJTl8zX1RFWFQhPSIiKSAlPiUgc2VsZWN0KEVJU19IT1JJR0lOXzNfVEVYVCkNCg0KIyBzZWxlY3RpbmcgcmVzcG9uc2VzIG9ubHkNCmVpc19yZXNwPC1laXNfcmVzcCAlPiUgbXV0YXRlKGFjcm9zcyhjKEVJU19FdGhuaV80LEVJU19FdGhuaV81LEVJU19FdGhuaV84KSx+NS0uKSkgJT4lIA0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShFSVNfVG90PXN1bShjX2Fjcm9zcyhFSVNfRXRobmlfMTpFSVNfRXRobmlfOSkpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQplaXNfc2NvcmluZzwtZWlzX3Jlc3AgJT4lIGRwbHlyOjpzZWxlY3QoRUlTX0V0aG5pXzE6RUlTX0V0aG5pXzkpDQprZXlfZWlzLmxpc3Q8LWxpc3QoVG90YWw9YygxOjkpKQ0Ka2V5X2VpczwtbWFrZS5rZXlzKDksa2V5X2Vpcy5saXN0LGNvbG5hbWVzKGVpc19zY29yaW5nKSkNCg0Kc2NhbGVzX2Vpczwtc2NvcmVJdGVtcyhrZXlfZWlzLmxpc3QsZWlzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19laXMpDQoNCmVpc19yZXNwICU+JSBzZWxlY3QoRUlTX0V0aG5pXzE6RUlTX0V0aG5pXzkpICU+JSBnYXRoZXIoKSAlPiUgIGdncGxvdChhZXMoeT12YWx1ZSx4PWtleSxjb2xvcj12YWx1ZSkpK2dlb21fYm94cGxvdCgpK2dlb21faml0dGVyKCkNCg0KDQoNCmBgYA0KDQojIEV2ZXJ5ZGF5IEluaXF1aXR5IC0gQ29udGVudA0KYGBge3IgRXZJTn0NCg0KYGBgDQoNCmBgYHtyfQ0KYmljZjwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoImJpY2YiKSkNCg0KYGBgDQoNCjEwIGl0ZW1zIDE9c2QgNSA9c2ENCg0KVGhlIG51bWJlcmluZyBpcyBhIGxpdHRsZSBvZGQgb24gdGhlIG9yaWdpbmFsIHNjYWxlLiBUaGVyZSdzIG9ubHkgMTAgaXRlbXMgbnVtYmVyZWQgdG8gMTQuDQo3ID0gNQ0KOCA9IDYNCjExID0gNw0KMTIgPSA4IA0KMTMgPSA5DQoxNCA9IDEwDQpyZXZlcnNlIHNjb3JlIDcsIDgsIDExLCAxMiwgMTMsIDE0IG9ubHkgZm9yIHRvdGFsIHN1YnNjYWxlIG1lYW4NCkhhcm1vbnk6IDEsIDIqLCAzLCA2IEhpZ2hlciBzY29yZXMgbWVhbiBoaWdoZXIgaGFybW9ueSAoYWZmZWN0aXZlKQ0KQ29uZmxpY3Q6IDcsIDgqLCAxMSwgMTIsIDEzLCAxNA0KSXRlbXMgMiBhbmQgOCBhcmUgb25seSBhc2tlZCBmb3IgcGFydGljaXBhbnRzIHdobyBzZWxmLWlkZW50aWZpZWQgYXMgYmljdWx0dXJhbC4NCg0KYGBge3J9DQojS2F5bGVpZ2gncyBhdHRlbXB0IGF0IHNjb3JpbmcgQklDVUxUVVJBTCBJREVOVElUWSBJTlRFR1JBVElPTiBNQVlCRT8gDQoNCmJpY2lpPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiYmljaWkiKSkNCg0KQklDSUk8LWJpY2lpICU+JSBtdXRhdGUoYWNyb3NzKGMoQklDSUlfNSxCSUNJSV82LEJJQ0lJXzcsQklDSUlfOCxCSUNJSV85LEJJQ0lJXzEwKSx+Ni0uKSkNCg0KQklDSUlfc2NvcmluZzwtQklDSUkgJT4lIGRwbHlyOjpzZWxlY3QoQklDSUlfMTpCSUNJSV8xMCkNCmtleV9CSUNJSS5saXN0PC1saXN0KFRvdGFsPWMoMToxMCkpDQprZXlfQklDSUk8LW1ha2Uua2V5cygxMCxrZXlfQklDSUkubGlzdCxjb2xuYW1lcyhCSUNJSV9zY29yaW5nKSkNCg0Kc2NhbGVzX0JJQ0lJPC1zY29yZUl0ZW1zKGtleV9CSUNJSS5saXN0LEJJQ0lJX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19CSUNJSSkNCg0KDQpgYGANCg0KIyBUb3NjYS0zDQoNCmBgYHtyfQ0KDQpgYGANCg0KIyBSZWxhdGlvbnNoaXAgYXNzZXNzbWVudCBzY2FsZQ0KDQpgYGB7cn0NCg0KYGBgDQoNCiMgU2VsZi1jb25jZWFsbWVudA0KDQpgYGB7cn0NCg0KYGBgDQoNCiMgTUlOSS1JUElQDQoNCiMgQ29tYmluaW5nIHNjYWxlcyBmb3IgcHJvamVjdHMNCg0KYGBge3IgS2F5bGVpZ2ggaG9ub3JzIHByb2plY3R9DQprYXlsZWlnaGRhdGE8LWNiaW5kKG1oaHNfZGF0YSRSZXNwb25zZUlkLG1oaHNfZGVtb3RibCxiaWNpaSxlaXMsZ2hzcWwsaXNtaSx0cnMsdHBzKQ0KI3dyaXRlLmNzdihrYXlsZWlnaGRhdGEsIi4uLzA2LUFuYWx5c2VzLzAzLUtheWxlaWdoL2theWxlaWdoZGF0YS5jc3YiKQ0KYGBgDQoNCg==